#include <list>
#include <deque>
#include <vector>
#include <forward_list>
#include <array>
#include <string>

using namespace std;

int main()
{
    // 每个容器有三个元素，用给定的初始化器进行初始化
    list<string> authors = {"Milton", "Shakespeare", "Austen"};
    vector<const char*> articles = {"a", "an", "the"};

    list<string> list2(authors);        // 正确：类型匹配
    // deque<string> authList(authors);    // 错误：容器类型不匹配
    // vector<string> words(articles);     // 错误：容器类型不匹配
    // 正确：可以将 const char* 元素转换为 string
    forward_list<string> words(articles.begin(), articles.end());

    list<string>::iterator it = authors.end();
    // 拷贝元素，直到（但不包括）it 指向的元素
    deque<string> authList(authors.begin(), it);

    vector<int> ivec(10, -1);       // 10 个 int 元素，每个都初始化为 -1
    list<string> svec(10, "hi!");   // 10 个 string，每个都初始化为"hi!"
    forward_list<int> ivec(10);     // 10 个 元素，每个都是空 string

    array<int, 42> iarr;            // 类型为：保存 42 个 int 的数组
    array<string, 10> sarr;         // 类型为：保存 10 个 string 的数组

    array<int, 10>::size_type i;    // 数组类型包括元素类型和大小
    // array<int>::size_type j;        // 错误：array<int> 不是一个类型

    array<int, 10> ia1;             // 10 个默认初始化的 int
    array<int, 10> ia2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 列表初始化
    array<int, 10> ia3 = {42};      // ia3[0] 为 42，剩余元素为 0

    int digs[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    // int cpy[10] = digs;             // 错误：内置数组不支持拷贝或赋值
    array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    array<int, 10> copy = digits;   // 正确：只要数组类型匹配即合法
}